﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace DoNet.SFExpress.Framework
{
    /// <summary>
    /// accessToken有效期只有2个小时，需要用户维护并定期重新获取令牌，避免接口调用失败
    /// 2个小时内调用该接口获取的令牌不变，2个小时后调用该接口将返回新的令牌
    /// </summary>
    public class AccessToken
    {
        /// <summary>
        /// 获取顺丰 AccessToken
        /// </summary>
        /// <param name="partnerID">合作伙伴编码（即顾客编码）</param>
        /// <param name="secret">合作伙伴密钥 （即校验码）</param>
        /// <param name="grantType">申请类型，填password </param>
        /// <param name="environment">调用环境，sfapi：生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static SFResponseAccessToken GetToken(string partnerID, string secret, string grantType = "password", string environment = "sfapi")
        {
            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["secret"] = secret;
            content["grantType"] = grantType;
            return HttpHelper.GetResponseAccessToken(content, environment);
        }

        /*
        1. 概述（适用开发语言 JAVA,Python,C#,Node.js,PHP）
        新增OAuth2认证说明
        accessToken有效期只有2个小时，需要用户维护并定期重新获取令牌，避免接口调用失败
        2个小时内调用该接口获取的令牌不变，2个小时后调用该接口将返回新的令牌
        点击进入OAuth2鉴权测试工具
        2. 请求地址
        环境	地址
        正式环境	https://sfapi.sf-express.com/oauth2/accessToken
        沙箱环境	https://sfapi-sbox.sf-express.com/oauth2/accessToken
        3. 通讯协议与报文格式
        通讯双方采用http post方法作为通讯协议。请求头必须添加

        “Content-type”,“application/x-www-form-urlencoded;charset=UTF-8” 字符集编码统一使用UTF-8

        4.参数说明
        4.1 请求参数
        参数列表	类型	是否必传	含义
        partnerID	String(64)	Y	合作伙伴编码（即顾客编码）
        secret	String(50)	Y	合作伙伴密钥 （即校验码）
        grantType	String(50)	Y	申请类型，填password

        4.2 响应参数
        参数名	类型	是否必填	描述
        apiResponseID	String(40)	Y	响应ID
        apiResultCode	String(10)	Y	响应码
        apiErrorMsg	String(200)	N	错误描述
        accessToken	String(100)	Y	访问令牌
        expiresIn	Number	Y	accessToken访问令牌过期时间，单位（秒）,默认7200秒。从申请成功后，开始倒计时7200s,令牌过期后（即expiresIn=0）需要重新获取
        4.3 OAuth2认证响应码
        响应码	异常信息	描述
        A1000	success	成功
        A1011	auth_error:${REASON}	认证失败：${原因}
        5.报文示例
        5.1 curl请求示例
        curl --request POST \
          --url https://sfapi.sf-express.com/oauth2/accessToken \
          --header 'content-type: application/x-www-form-urlencoded' \
          --data partnerID=yourclientcode \
          --data secret=yourcheckword \
          --data grantType=password
        5.2响应报文
        成功报文

        {
            "apiResultCode": "A1000",
            "apiErrorMsg": "success",
            "apiResponseID": "000180E0AC18933F963C52701B18C03F",
            "accessToken": "20D02FC4F63B4A4AA7C9A236EAD5B0A1",
            "expiresIn": 5150
        }
        失败报文

        {
            "apiResultCode": "A1011",
            "apiErrorMsg": "auth_error:partnerID:test010d_is_not_exist",
            "apiResponseID": "8VYUxU2eL9ZgBXtGXrj",
            "accessToken": null,
            "expiresIn": null
        } 
        */
    }
}
